/*
 * 
 * Proj. Wireless - UFRN
 * 
 */
package API_itextpdf;

import com.adobe.acrobat.Viewer;
import com.itextpdf.text.*;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.draw.LineSeparator;
import java.awt.BorderLayout;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import metodologia.DadosMetodologia;

public class GerenciadorPDF implements java.io.Serializable {

    public static final Font BOLD10;
    public static final Font BOLD12;
    public static final Font BOLD14;
    public static final Font NORMAL10;
    public static final Font NORMAL12;

    static {
        BaseFont timesbd = null;
        BaseFont times = null;
        try {
            timesbd = BaseFont.createFont("c:/windows/fonts/timesbd.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED);
            times = BaseFont.createFont("c:/windows/fonts/times.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED);
        } catch (DocumentException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

        BOLD10 = new Font(timesbd, 10);
        BOLD12 = new Font(timesbd, 12);
        BOLD14 = new Font(timesbd, 14);
        NORMAL10 = new Font(times, 10);
        NORMAL12 = new Font(times, 12);
    }
    

    public void createPdf2(DadosMetodologia dados, ArrayList<String[]> exec, String filename) throws DocumentException, IOException {
        // step 1
        Document document = new Document(PageSize.A4);
        //Document document = new Document(PageSize.LETTER.rotate());
        // step 2
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Date date = new Date();
        String dataString = dateFormat.format(date);

        //Carrega a capa (Load existing PDF)
        PdfContentByte cb = writer.getDirectContent();

        PdfReader reader = new PdfReader("../softMetodologia_v3.0/src/ImageFiles/capa.pdf");
        PdfImportedPage page = writer.getImportedPage(reader, 1);

        //copia a capa carregada para o relatorio (Copy first page of existing PDF into output PDF)
        document.newPage();

        cb.addTemplate(page, 0, 0);

        document.newPage();

        /*
         * Sumario
         */
////        usado para adicionar texto em determinado local do pdf!!
////        PdfContentByte canvas = writer.getDirectContentUnder();
////        writer.setCompressionLevel(0);
////        canvas.saveState(); // q
////        canvas.beginText(); // BT
////        canvas.moveText(360, 787); // 36 788 Td
////        canvas.setFontAndSize(
////        BaseFont.createFont(), 12); // /F1 12 Tf
////        canvas.showText("Hello World"); // (Hello World)Tj
////        canvas.endText(); // ET
////        canvas.restoreState(); // Q

        document.newPage();

        /*
         * Prefacio
         */

        cabecalho(document, dados);

        document.add(new Paragraph("Prefácio", new Font(BOLD14)));
        
        
        
        Phrase phrase0 = new Phrase("              O referido documento tem sido criado pelo grupo de pesquisa do projeto ",NORMAL12);
        Phrase phrase1 = new Phrase("Avaliação de Desempenho das Redes de Instrumentação Sem-fio (ProjWireless) ",BOLD12);
        Phrase phrase2 = new Phrase("em parceria direta com a ",NORMAL12);
        Phrase phrase3 = new Phrase("Petrobras-Cenpes ",BOLD12);
        Phrase phrase4 = new Phrase("com o objetivo de dar suporte na instalação e no comissionamento "
                + "de instrumentos wireless. Entende-se por instrumento wireless todo aquele dispositivo com "
                + "suporte aos padrões WirelessHART ou ISA100.11a.",NORMAL12);
        
        document.add(phrase0);
        document.add(phrase1);
        document.add(phrase2);
        document.add(phrase3);
        document.add(phrase4);

        Paragraph paragraph1 = new Paragraph("              O documento assume que o leitor tem conhecimentos mínimos sobre redes industriais "
                + "sem fio e os padrões WirelessHART e ISA100.11a. Detalhes sobre essas tecnologias são encontradas " 
                + "em [1] [2] [3].", new Font(NORMAL12));
        Paragraph paragraph2 = new Paragraph("              A lista completa de fornecedores dos instrumentos WirelessHART e ISA100.11a, até "
                + "o momento da escrita desse documento, é a seguinte:", new Font(NORMAL12));
        Paragraph paragraph3 = new Paragraph("              "/*Ponto*/ + "WirelessHART: Emerson, Siemens, ABB, Endress + Hauser e Pepperl + Fuchs.", new Font(NORMAL12));
        Paragraph paragraph4 = new Paragraph("              "/*Ponto*/ + "ISA100.11a: Honeywell e Yokogawa.", new Font(NORMAL12));

        paragraph1.setAlignment(Paragraph.ALIGN_JUSTIFIED);
        paragraph2.setAlignment(Paragraph.ALIGN_JUSTIFIED);
        paragraph3.setAlignment(Paragraph.ALIGN_JUSTIFIED);
        paragraph4.setAlignment(Paragraph.ALIGN_JUSTIFIED);
        
        document.add(paragraph1);
        document.add(paragraph2);
        document.add(paragraph3);
        document.add(paragraph4);
        
        //Historico de Revisoes
        document.add(new Paragraph("Histórico de Revisões", new Font(BOLD14)));        
        Image image = Image.getInstance ("../softMetodologia_v3.0/src/ImageFiles/Tabela1.jpg"); 
        document.add(image);
        
        //Sugestoes
        document.add(new Paragraph("Sugestões", new Font(BOLD14)));
        Paragraph paragraph5 = new Paragraph("              Envie suas sugestões, dúvidas e outras requisições para a nossa equipe através "
                + "do e-mail contato@projwireless-ufrn.com.", new Font(NORMAL12));
        paragraph5.setAlignment(Paragraph.ALIGN_JUSTIFIED);
        document.add(paragraph5);
        
        
        document.newPage();


        /*
         * Metodologia
         */
        cabecalho(document, dados);
        document.add(new Paragraph(dados.getNome(), new Font(BOLD14)));
        //descrição da metodologia AKI!!!
        //dados da execução: Grafico em barras AKI!!!!
        //
        document.add(new Paragraph(""));

        int x = 1;
        for (Iterator it = exec.iterator(); it.hasNext();) {
            String[] dado = (String[]) it.next();

            if (x == Integer.parseInt(dado[0])) {
                document.add(new Paragraph("    Teste " + exec.get(x)[0] + ": " + exec.get(x)[3], BOLD14));
                // DESCRIÇAO DO TESTE AKI!!!!!!!!    testNode.getJFData().getDescricao();
                document.add(new Paragraph("        " + exec.get(x)[4]));
                x++;
            }
            if (Integer.parseInt(dado[1]) != 0) {
                document.add(new Paragraph("            Conjunto de Etapas " + dado[1] + ": ", BOLD14));
                escreverEtapas(document, Integer.parseInt(dado[1]), dado[2], dados); //acho q esse dado aki ta errado!!
            }
        }

        document.newPage();
        
        /*
         * Conclusao e Referencias
         */
        cabecalho(document, dados);
        document.add(new Paragraph("Conclusão", new Font(BOLD14)));
        
        document.add(new Paragraph(" "));
        
        Paragraph paragraph6 = new Paragraph("              O desenvolvimento desta metodologia para instalação "
                + "de equipamentos wireless deverá abordar diversos pontos teóricos (envolvendo as normas)"
                + " e práticos (envolvendo as instalações dos equipamentos em plantas reais). "
                + "Para que este documento possa ser uma referência a ser utilizada tanto em fases "
                + "de projeto quanto de instalação é necessário que todos que fazem parte deste projeto "
                + "direta ou indiretamente sigam esta metodologia, informando dados tão precisos quanto "
                + "possíveis e contribuindo com informações não contempladas nos testes, mas que foram "
                + "presenciadas durante a execução deles.",new Font(NORMAL12));

        paragraph6.setAlignment(Paragraph.ALIGN_JUSTIFIED_ALL);
        document.add(paragraph6);
        
        document.add(new Paragraph(" "));
        
        document.add(new Paragraph("Referências", new Font(BOLD14)));
        
        document.add(new Paragraph(" "));

        Phrase phrase5 = new Phrase("1. WILLIG, A. Recent and Emerging Topics in Wireless Industrial Communications: A Selection. ",new Font(NORMAL10));
        Phrase phrase6 = new Phrase("IEEE Transaction on                    Industrial Informatics", new Font(BOLD10));
        Phrase phrase7 = new Phrase(", v. 4, n. 2, p. 102-124, 2008. \n",new Font(NORMAL10));
        
        Phrase phrase8 = new Phrase("2. PETERSEN, S.; CARLSEN, S. WirelessHart Versus ISA100.11a: The Format War Hits the Factory Floor. ", new Font(NORMAL10));
        Phrase phrase9 = new Phrase("IEEE Industrial           Electronics Magazine",new Font(BOLD10));
        Phrase phrase10 = new Phrase(", v. 5, n. 4, p. 23-34, 2011. \n", new Font (NORMAL10));
        
        Phrase phrase11 = new Phrase("3. CHEN, D.; NIXON, M.; MOK, A. ", new Font(NORMAL10));
        Phrase phrase12 = new Phrase("WirelessHART: ", new Font(BOLD10));
        Phrase phrase13 = new Phrase("Real-Time Mesh Network for Industrial Automation. [S.l.]: Incorporated         Springer Publishing Company, 2010.", new Font(NORMAL10));
        
        document.add(phrase5);
        document.add(phrase6);
        document.add(phrase7);
        document.add(phrase8);
        document.add(phrase9);
        document.add(phrase10);
        document.add(phrase11);
        document.add(phrase12);
        document.add(phrase13);
        
        document.newPage();

//////        /*
//////         * Descrição geral
//////         */
//////        
//////        document.add(new Paragraph("Metodologia", new Font(Font.FontFamily.HELVETICA, 18)));
//////        document.add(new Paragraph(" "));
//////        
//////        for (int u = 0; u<dados.getListaDeTestes().size(); u++){
//////            
//////            document.add(new Paragraph(" "));
//////            
//////            document.add(new Paragraph("Teste: " + dados.getListaDeTestes().get(u).getTitulo()));
//////            document.add(new Phrase("Descrição: " + dados.getListaDeTestes().get(u).getDescricaoTeste()));
//////            for (int h = 0; h<dados.getListaDeTestes().get(u).getListaDoConjuntoDasEtapas().size(); h++){
//////                
//////                document.add(new Paragraph("Conj. Etapas: " + dados.getListaDeTestes().get(u).getListaDoConjuntoDasEtapas().get(h).getId()));
//////                for (int k = 0; k<dados.getListaDeTestes().get(u).getListaDoConjuntoDasEtapas().get(h).getListaDeEtapa().size(); k++){
//////                    
//////                    document.add(new Paragraph("Etapa: " + dados.getListaDeTestes().get(u).getListaDoConjuntoDasEtapas().get(h).getListaDeEtapa().get(k).getTitulo()));
//////                    document.add(new Phrase("Descrição da Etapa: " + dados.getListaDeTestes().get(u).getListaDoConjuntoDasEtapas().get(h).getListaDeEtapa().get(k).getDescricao()));
//////                    for (int u = 0; u<dados.getProgress().size(); u++){
//////                    
//////                        if ((dados.getProgress().get(u).getTestId() == u)&&
//////                                (dados.getProgress().get(u).getStepId() == h)){
//////                            
//////                            document.add(new Paragraph("Quantidade de Etapas: " + dados.getProgress().get(u).getCheckBox().length));
//////                            
//////                        }
//////                    
//////                    }
//////                    
//////                }
//////            }
//////            
//////        }
//////        
//////        
//////        /*
//////         * Execução
//////         */
//////               
//////        float a =0;
//////        float b=0;
//////        String conc;
//////        for (Iterator it = exec.iterator(); it.hasNext();) {
//////            String[] dado = (String[]) it.next();
//////            
//////            a = a + Float.parseFloat(dado[3]);
//////            b = b + Float.parseFloat(dado[4]);
//////        }
//////        conc = String.valueOf((a*100)/b);
//////                
//////        document.add(new Paragraph("Execução", new Font(Font.FontFamily.HELVETICA, 18)));
//////        document.add(new Paragraph(" "));
//////        
//////        document.add(new Paragraph("A Metodologia está " + conc + "% concluida"));
//////        document.add(new Paragraph(" "));
//////        
//////        int x = 1;
//////        float c = 0;
//////        float d =0;
//////        for (Iterator it = exec.iterator(); it.hasNext();) {
//////            String[] dado = (String[]) it.next();
//////        
//////            for (Iterator it2 = exec.iterator(); it2.hasNext();) {
//////                String[] dado2 = (String[]) it2.next();
//////                
//////                if (x == Integer.parseInt(dado2[0])) {
//////                    c = c + Integer.parseInt(dado2[3]);
//////                    d = d + Integer.parseInt(dado2[4]);
//////                }
//////            }
//////            
//////            if (x == Integer.parseInt(dado[0])) {
//////                document.add(new Paragraph("Teste" + exec.get(x)[0] + ": " + ((c*100)/d) + "% concluido"));
//////                x++;
//////            }
//////            
//////            document.add(new Paragraph(" # Etapa" + dado[1] + ": " + dado[2] + "% concluida"));
//////            c =0;
//////            d = 0;
//////        }
//////        
//////        document.add(new Paragraph(" "));
//////        
//////        
        /*
         * Tabelas de dados
         */

        document.add(new Paragraph("Tabelas de dados", BOLD14));
        document.add(new Paragraph(" "));
        
        //Percorre todos os conj.etapas
        for(int i=0; i<dados.getProgress().size(); i++){
            
            //Percorre todos os checkboxs do progress escolhido
            for (int j=0; j<dados.getProgress().get(i).getCheckBox().length; j++){
                
                //Verifica se existe modificação ou a tabela continua null
                if (dados.getProgress().get(i).getActive().get(j)){
                
                    document.add(new Paragraph(" "));
                    document.add(new Paragraph("Teste: " + dados.getProgress().get(i).getTestId() +
                        " Conj. Etapas: " + dados.getProgress().get(i).getStepId()+
                        " - Quant. Etapas: " + dados.getProgress().get(i).getCheckBox().length));
                    
                    PdfPTable table = new PdfPTable(dados.getProgress().get(i).getTitleTable().get(j).size());
                    //PdfPCell header = new PdfPCell(new Paragraph("Variáveis de execução"));
                    //header.setColspan(dados.getProgress().get(i).getTitleTable().size());

                    //Adiciona os titulos da tabela
                    //table.addCell(header);
                    for(int p=0; p<dados.getProgress().get(i).getTitleTable().get(j).size(); p++){
                        table.addCell(dados.getProgress().get(i).getTitleTable().get(j).get(p));
                    }

                    //Adiciona os dados da tabela
                    for (int u=0; u<dados.getProgress().get(i).getTableItens().get(j).size(); u++){
                        for (int l=0; l<dados.getProgress().get(i).getTableItens().get(j).get(u).size(); l++){
                            if (dados.getProgress().get(i).getTableItens().get(j).get(u).get(l).equals("")){
                                table.addCell(" ");                               
                            } else{
                                table.addCell(dados.getProgress().get(i).getTableItens().get(j).get(u).get(l));
                            }
                        }
                    }    

                    //Adiciona ao documento.
                    document.add(new Paragraph(" "));
                    document.add(table);
                    
                }
            }
        }

        // step 5
        document.close();

        //
        // Mostrando o relatorio em um aplicativo em JAVA
        // -> Pronto para uso!
        //
        
        int response;
        
        response = JOptionPane.showConfirmDialog(null, "Deseja abrir o relatório gerado?", "Aviso", JOptionPane.YES_NO_OPTION);
        
//        try{
////            Runtime.getRuntime().exec("cmd.exe","C:/Program Files <x86>/Adobe/Reader 10.0/Reader/AcroRd32.exe", filename);
//            //Runtime.getRuntime().exec(filename);
//            Runtime.getRuntime().exec("start my.pdf");
//        } catch (Exception e){
//            System.out.println("erro");
//        }
        
        if (response == JOptionPane.YES_OPTION){
            
            InputStream input;
            Viewer viewer;  
            JFrame frame = new JFrame("Visualização do Relatório: "+ filename);  
            frame.setLayout(new BorderLayout());

            try{  

                viewer = new Viewer();  
                frame.add(viewer, BorderLayout.CENTER);  
                input = new FileInputStream (new File(filename));
                        //new File("C:/Users/Heitor/Documents/NetBeansProjects/trunk/"
                        //+ "Relatório_MetodologiaPreliminar_12-11-2012 23-46-19.pdf"));

                if(input != null){  

                    ByteArrayOutputStream output = new ByteArrayOutputStream();  
                    // set read buffer size  

                    byte[] rb = new byte[1024];  
                    int ch = 0;  

                    while ((ch = input.read(rb)) != -1){  
                        output.write(rb, 0, ch);  
                    }
                    byte[] b = output.toByteArray();  
                    input.close();  
                    output.close();  

                    viewer.setDocumentInputStream(new ByteArrayInputStream(b));  
                }  

                viewer.activate();  

                viewer.setProperty("Default_Page_Layout", "SinglePage");  
                viewer.setProperty("Default_Zoom_Type", "FitVisibleWidth");  
                viewer.setProperty("Default_Magnification", "100");  

                frame.setSize(800, 600);  
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  
                frame.setVisible(true);  
            }  
            catch(Exception e){  
                JOptionPane.showMessageDialog(null,  
                            "Não foi possível  abrir o arquivo!",  
                            "Erro", JOptionPane.ERROR_MESSAGE);
            }   
        }
        
        System.out.println("** Relatório gerado com sucesso! ** \n " + filename);
    }

    /*
     * Cabeçalho
     */
    public void cabecalho(Document document, DadosMetodologia dados) throws DocumentException {
        document.add(new Paragraph("Metodologia para instalação de instrumentos wireless"));
        document.add(new Paragraph("Versão " + dados.getVersao() /*Mes e ano da metodologia*/));
        document.add(new Paragraph(" "));
        document.add(new LineSeparator());
        document.add(new Paragraph(" "));

    }

    /*
     * Escreve as etapas e suas macações
     */
    private void escreverEtapas(Document document, int catId_conj, String dado, DadosMetodologia dados) throws DocumentException, BadElementException, MalformedURLException, IOException {
        
        String nome = "";
        String descricao = "";
        char[] aux = dado.toCharArray();
        int length = aux.length;
        Image imageD = Image.getInstance ("../softMetodologia_v3.0/src/ImageFiles/CheckBox(D).jpg"); 
        Image imageM = Image.getInstance ("../softMetodologia_v3.0/src/ImageFiles/CheckBox(M).jpg"); 

        int u = 0;
        int h;
        
        for (int i = 0; i<dados.getListaDeTestes().size(); i++){
            for (int j = 0; j<dados.getListaDeTestes().get(i).getListaDoConjuntoDasEtapas().size(); j++){
                 for (int k = 0; k<dados.getListaDeTestes().get(i).getListaDoConjuntoDasEtapas().get(j).getListaDeEtapa().size(); k++){
                    if (dados.getListaDeTestes().get(i).getListaDoConjuntoDasEtapas().get(j).getCatid() == catId_conj){
                        if (u < length){
                            h = u+1;
                            nome = dados.getListaDeTestes().get(i).getListaDoConjuntoDasEtapas().get(j).getListaDeEtapa().get(k).getTitulo();
                            descricao = dados.getListaDeTestes().get(i).getListaDoConjuntoDasEtapas().get(j).getListaDeEtapa().get(k).getDescricao();
                            
                            PdfPTable tabela = new PdfPTable(4); //cria uma tabela com 4 colunas
                            tabela.setWidths(new int[]{1, 7, 17, 1});

                            Paragraph p0 = new Paragraph(h + "-");
                            PdfPCell celula0 = new PdfPCell(p0);
                            
                            Paragraph p1 = new Paragraph(nome);
                            PdfPCell celula1 = new PdfPCell(p1); 
                            
                            Paragraph p2 = new Paragraph(descricao);
                            PdfPCell celula2 = new PdfPCell(p2);
                            
                            PdfPCell celula3 = new PdfPCell(imageD); //Default é desmarcado
                            if (aux[u] == '1') {
                                //adicione quadrado marcado
                                //document.add(imageM);                                
                                celula3 = new PdfPCell(imageM);
                                celula3.setHorizontalAlignment(Element.ALIGN_RIGHT);
                            }else if (aux[u] == '0') {
                                //adicione quadrado desmarcado
                                //document.add(imageD);                                                            
                                celula3 = new PdfPCell(imageD);
                                celula3.setHorizontalAlignment(Element.ALIGN_RIGHT);
                            }

                            celula0.setBorder(-1); // aqui vc tira as bordas da celula   
                            celula1.setBorder(-1);    
                            celula2.setBorder(-1);  
                            celula3.setBorder(-1);
                            
                            tabela.addCell(celula0); //aqui adiciona as celulas na tabela.
                            tabela.addCell(celula1);   
                            tabela.addCell(celula2);  
                            tabela.addCell(celula3); 
                            
                            document.add(tabela); // coloca a tabela na pagina do PDF.
                            
                        }//if
                        u++;
                    }//if
                }//k
            }//j
        }//i

    } //fim da função
    
    public void addTable(Document document,String[] conteudo, int size) throws DocumentException{
        PdfPTable table = new PdfPTable(size);
        
        //adicionando dados
        for(int i = 0; i<conteudo.length; i++) {
            table.addCell(conteudo[i]);
        }
        
        document.add(table);
    }
}
